home *** CD-ROM | disk | FTP | other *** search
/ Belgian Amiga Club - ADF Collection / BS1 part 43.zip / Sources C- WorkDisk V.adf / ex / flood.c < prev    next >
C/C++ Source or Header  |  1987-02-15  |  11KB  |  363 lines

  1.  
  2. /* examples of flood fills  -  v 1.1 ? */
  3.  
  4. #include "exec/types.h"
  5. #include "exec/memory.h"
  6. #include "graphics/gfx.h"
  7. #include "graphics/gfxmacros.h"
  8. #include "intuition/intuition.h"
  9.  
  10. #define INTUITION_REV 0
  11. #define GRAPHICS_REV 0
  12.  
  13. #define SBMWIDTH 320   /* Screen BitMap Constants */
  14. #define SBMHEIGHT 200
  15. #define SBMDEPTH 4
  16.  
  17. #define WBMWIDTH 128   /* Window BitMap Constants */
  18. #define WBMHEIGHT 128
  19. #define WBMDEPTH 4
  20.  
  21. struct IntuitionBase *IntuitionBase = 0;
  22. struct GfxBase *GfxBase = 0;
  23.  
  24. struct IntuiMessage *MyIntuiMessage = 0;
  25.  
  26. struct TextAttr TestFont = { /* Needed for opening screen */
  27.    "topaz.font", 
  28.    TOPAZ_EIGHTY, 0, 0
  29. };
  30.  
  31. struct Screen *screen; /* These are for Custom screen */
  32. struct ViewPort *vp1;
  33.  
  34. struct Window *wNormal = 0; /* Two Windows */
  35. struct Window *wSuper = 0;
  36. struct BitMap MyBitMap; /* wSuper is a super bitmap, this is it */
  37.  
  38. UWORD areabuffer[250], areabuffer2[250];   /* These are for Fills */
  39. struct TmpRas myTmpRas, myTmpRas2;
  40. struct AreaInfo myAreaInfo, myAreaInfo2;
  41. PLANEPTR myplane, myplane2;
  42.  
  43. WORDBITS areapat1[] = {         /* These are for Fills */
  44.    0xCCCC, 
  45.    0xCCCC, 
  46.    0xCCCC, 
  47.    0xCCCC, 
  48.    0xCCCC, 
  49.    0xCCCC, 
  50.    0xCCCC, 
  51.    0xCCCC 
  52. };
  53.  
  54. WORDBITS areapat2[] = {         /* These are for Fills */
  55.    0xAAAA, 
  56.    0xAAAA, 
  57.    0xAAAA, 
  58.    0xAAAA, 
  59.    0xAAAA, 
  60.    0xAAAA, 
  61.    0xAAAA, 
  62.    0xAAAA 
  63. };
  64.  
  65. struct NewScreen ns = {      /* These are for my custom screen */
  66.    0, 0,                     /* start position */
  67.    SBMWIDTH, SBMHEIGHT, SBMDEPTH,   /* width, height, depth */
  68.    7, 3,                     /* detail pen, block pen */
  69.    NULL,                     /* viewing mode */
  70.    CUSTOMSCREEN,             /* screen type */
  71.    &TestFont,                /* font to use */
  72.    "BOBS",                   /* default title for screen */
  73.    NULL                      /* pointer to additional gadgets */
  74. };
  75.  
  76. struct NewWindow nwNormal = {
  77.    00, 11,                   /* start position (left, top) */
  78.    WBMWIDTH, WBMHEIGHT,      /* width, height */
  79.    -1, -1,                   /* detail pen, block pen */
  80.    CLOSEWINDOW,              /* IDCMP flags */
  81.    WINDOWDRAG | WINDOWDEPTH | WINDOWCLOSE
  82.    | SMART_REFRESH | GIMMEZEROZERO | ACTIVATE,   /* window flags */
  83.    NULL,                     /* pointer to first user gadget */
  84.    NULL,                     /* pointer to first checkmarkw */
  85.    "Smart",                  /* window title */
  86.    NULL,                     /* pointer to screen  (filled later) */
  87.    NULL,                     /* pointer to superbitmap */
  88.    40, 20, WBMWIDTH, WBMHEIGHT, /* ignored, not a sized window */
  89.    CUSTOMSCREEN              /* type of screen for this window */
  90. };
  91.  
  92. struct NewWindow nwSuper = {
  93.    130, 11,                  /* start position */
  94.    WBMWIDTH, WBMHEIGHT,      /* width, height */
  95.    -1, -1,                   /* detail pen, block pen */
  96.    CLOSEWINDOW,              /* IDCMP flags */
  97.    WINDOWDRAG | WINDOWDEPTH | WINDOWCLOSE
  98.    | SUPER_BITMAP | GIMMEZEROZERO | ACTIVATE,   /* window flags */
  99.    NULL,                     /* pointer to first user gadget    */
  100.    NULL,                     /* pointer to first checkmark */
  101.    "Super",                  /* title */
  102.    NULL,                     /* pointer to screen  (filled later) */
  103.    NULL,                     /* pointer to superbitmap (filled later) */
  104.    40, 20, WBMWIDTH, WBMHEIGHT, /* ignored, not a sized window */
  105.    CUSTOMSCREEN              /* type of screen for this window */
  106. };
  107.  
  108. main()
  109. {
  110.  
  111.    WORD i;
  112.  
  113. /*** Open libraries that will be needed **********************/
  114.  
  115.    if ((IntuitionBase = (struct IntuitionBase *)
  116.       OpenLibrary("intuition.library", INTUITION_REV)) == 0)
  117.    {
  118.       MyCleanup();
  119.       Exit(FALSE);
  120.    }
  121.  
  122.    if ((GfxBase = (struct GfxBase *)
  123.     OpenLibrary("graphics.library", GRAPHICS_REV)) == 0) {
  124.       MyCleanup();
  125.       Exit(FALSE);
  126.    }
  127.  
  128.    /*** Open My Very Own Screen ******************************/
  129.  
  130.    screen = (struct Screen *)OpenScreen(&ns);
  131.  
  132.    /*** Open a regular window ********************************/
  133.  
  134.    nwNormal.Screen = screen;
  135.    wNormal = (struct Window *)OpenWindow(&nwNormal);
  136.  
  137.    /*** Open a SuperBitMap window ****************************/
  138.  
  139.    /*** First Initialize, Then fill fill in missing pointers ***/ 
  140.    InitBitMap(&MyBitMap, WBMDEPTH, WBMWIDTH, WBMHEIGHT);
  141.    for(i=0;i<WBMDEPTH;i++) {
  142.       if ((MyBitMap.Planes[i] = (PLANEPTR)
  143.        AllocRaster(WBMWIDTH, WBMHEIGHT)) == 0) {  
  144.          MyCleanup();
  145.          Exit(FALSE);
  146.       }
  147.       BltClear(MyBitMap.Planes[i], (WBMWIDTH/8)*WBMHEIGHT, 1);
  148.    }
  149.  
  150.    /* Set up those pointers that couldn't be initialized staticly */
  151.    nwSuper.Screen = screen;
  152.    nwSuper.BitMap = &MyBitMap;
  153.  
  154.    /*** Call OpenWindow, Now that everything is set up *******/
  155.    if ((wSuper = (struct Window *)
  156.       OpenWindow(&nwSuper)) == NULL)
  157.    {
  158.       MyCleanup();
  159.       Exit(FALSE);
  160.    }
  161.  
  162.    /*** Set Normals' colors **********************************/
  163.  
  164.    vp1 = &wNormal->WScreen->ViewPort;
  165.    SetRGB4(vp1, 0, 0, 0, 0);   /* Black             */
  166.    SetRGB4(vp1, 1, 15, 0, 0);   /* Red               */
  167.    SetRGB4(vp1, 2, 0, 15, 0);   /* Green             */
  168.    SetRGB4(vp1, 3, 0, 0, 15);   /* Deep Blue         */
  169.    SetRGB4(vp1, 4, 15, 15, 0);   /* Yellow            */
  170.    SetRGB4(vp1, 5, 15, 0, 15);   /* Magenta           */
  171.    SetRGB4(vp1, 6, 8, 15, 15);   /* Cyan              */
  172.    SetRGB4(vp1, 7, 15, 11, 0);   /* Orange            */
  173.    SetRGB4(vp1, 8, 5, 13, 0);   /* Lime Green        */
  174.    SetRGB4(vp1, 9, 14, 3, 0);   /* Fire Engine Red   */
  175.    SetRGB4(vp1, 10, 15, 2, 14);   /* Violet            */
  176.    SetRGB4(vp1, 11, 15, 13, 11);   /* Tan               */
  177.    SetRGB4(vp1, 12, 12, 9, 8);   /* Brown             */
  178.    SetRGB4(vp1, 13, 11, 11, 11);   /* Grey              */
  179.    SetRGB4(vp1, 14, 7, 13, 15);   /* Sky Blue          */
  180.    SetRGB4(vp1, 15, 15, 15, 15);   /* White             */
  181.  
  182.    /*** Initialize regular window for Fills ******************/
  183.  
  184.    InitArea(&myAreaInfo, &areabuffer[0], 100);
  185.    if ((myplane = (PLANEPTR)
  186.     AllocRaster(WBMWIDTH, WBMHEIGHT)) == NULL) {
  187.       MyCleanup();
  188.       Exit(FALSE);
  189.    }
  190.    wNormal->RPort->TmpRas = (struct TmpRas *)
  191.     InitTmpRas(&myTmpRas, myplane, RASSIZE(WBMWIDTH, WBMHEIGHT));
  192.    wNormal->RPort->AreaInfo = &myAreaInfo;
  193.  
  194.    /*** Initialize SuperBitMap window for Fills **************/
  195.  
  196.    InitArea(&myAreaInfo2, &areabuffer2[0], 100);
  197.    if ((myplane2 = (PLANEPTR)
  198.     AllocRaster(WBMWIDTH, WBMHEIGHT)) == NULL) { 
  199.       MyCleanup();
  200.       Exit(FALSE);
  201.    }
  202.    wSuper->RPort->TmpRas = (struct TmpRas *)
  203.       InitTmpRas(&myTmpRas2, myplane2, RASSIZE(WBMWIDTH, WBMHEIGHT));
  204.    wSuper->RPort->AreaInfo = &myAreaInfo2;
  205.  
  206.    /*** Draw and fill in both windows ************************/
  207.  
  208.    DrawSquare(wNormal, 2,  5,  5, 100, 100);
  209.    DrawSquare(wNormal, 2, 10, 10,  35,  35);
  210.    DrawSquare(wNormal, 3, 40, 10,  65,  35);
  211.    DrawSquare(wNormal, 2, 70, 10,  95,  35);
  212.    DrawSquare(wNormal, 3, 10, 40,  35,  65);
  213.    DrawSquare(wNormal, 4, 40, 40,  65,  65);
  214.    DrawSquare(wNormal, 3, 70, 40,  95,  65);
  215.    DrawSquare(wNormal, 2, 10, 70,  35,  95);
  216.    DrawSquare(wNormal, 3, 40, 70,  65,  95);
  217.    DrawSquare(wNormal, 2, 70, 70,  95,  95);
  218.  
  219.    SetAfPt(wNormal->RPort, areapat1, 3);
  220.    SetOPen(wNormal->RPort, 2);
  221.  
  222.    SetAPen(wNormal->RPort, 4);
  223.    Flood(wNormal->RPort, 1, 11, 11);
  224.    SetAPen(wNormal->RPort, 5);
  225.    Flood(wNormal->RPort, 1, 41, 11);
  226.    SetAPen(wNormal->RPort, 6);
  227.    Flood(wNormal->RPort, 1, 71, 11);
  228.    SetAPen(wNormal->RPort, 7);
  229.    Flood(wNormal->RPort, 1, 11, 41);
  230.    SetAPen(wNormal->RPort, 8);
  231.    Flood(wNormal->RPort, 1, 41, 41);
  232.    SetAPen(wNormal->RPort, 9);
  233.    Flood(wNormal->RPort, 1, 71, 41);
  234.    SetAPen(wNormal->RPort, 10);
  235.    Flood(wNormal->RPort, 1, 11, 71);
  236.    SetAPen(wNormal->RPort, 11);
  237.    Flood(wNormal->RPort, 1, 41, 71);
  238.    SetAPen(wNormal->RPort, 12);
  239.    Flood(wNormal->RPort, 1, 71, 71);
  240.  
  241.    SetAfPt(wNormal->RPort, areapat2, 3);
  242.    SetAPen(wNormal->RPort, 13);
  243.    Flood(wNormal->RPort, 0, 6, 6);
  244.  
  245.    DrawSquare(wSuper, 3,  5,  5, 100, 100);
  246.    DrawSquare(wSuper, 2, 10, 10,  35,  35);
  247.    DrawSquare(wSuper, 3, 40, 10,  65,  35);
  248.    DrawSquare(wSuper, 2, 70, 10,  95,  35);
  249.    DrawSquare(wSuper, 3, 10, 40,  35,  65);
  250.    DrawSquare(wSuper, 1, 40, 40,  65,  65);
  251.    DrawSquare(wSuper, 3, 70, 40,  95,  65);
  252.    DrawSquare(wSuper, 2, 10, 70,  35,  95);
  253.    DrawSquare(wSuper, 3, 40, 70,  65,  95);
  254.    DrawSquare(wSuper, 2, 70, 70,  95,  95);
  255.  
  256.    SetAfPt(wSuper->RPort, areapat1, 3);
  257.    SetOPen(wSuper->RPort, 3);
  258.  
  259.    SetAPen(wSuper->RPort, 4);
  260.    Flood(wSuper->RPort, 1, 11, 11);
  261.    SetAPen(wSuper->RPort, 5);
  262.    Flood(wSuper->RPort, 1, 41, 11);
  263.    SetAPen(wSuper->RPort, 6);
  264.    Flood(wSuper->RPort, 1, 71, 11);
  265.    SetAPen(wSuper->RPort, 7);
  266.    Flood(wSuper->RPort, 1, 11, 41);
  267.    SetAPen(wSuper->RPort, 8);
  268.    Flood(wSuper->RPort, 1, 41, 41);
  269.    SetAPen(wSuper->RPort, 9);
  270.    Flood(wSuper->RPort, 1, 71, 41);
  271.    SetAPen(wSuper->RPort, 10);
  272.    Flood(wSuper->RPort, 1, 11, 71);
  273.    SetAPen(wSuper->RPort, 11);
  274.    Flood(wSuper->RPort, 1, 41, 71);
  275.    SetAPen(wSuper->RPort, 12);
  276.    Flood(wSuper->RPort, 1, 71, 71);
  277.  
  278.    SetAfPt(wSuper->RPort, areapat2, 3);
  279.    SetAPen(wSuper->RPort, 13);
  280.    Flood(wSuper->RPort, 0, 6, 6);
  281.  
  282.    for (;;)
  283.    {
  284.       Wait ((1 << wNormal->UserPort->mp_SigBit) /* wait on either */
  285.          | (1 << wSuper->UserPort->mp_SigBit));
  286.       while(MyIntuiMessage = (struct IntuiMessage *)
  287.       GetMsg(wNormal->UserPort))
  288.       switch (MyIntuiMessage->Class) {
  289.          case CLOSEWINDOW:
  290.             ReplyMsg(MyIntuiMessage);
  291.             MyCleanup();
  292.             Exit(TRUE);
  293.          default:
  294.             ReplyMsg(MyIntuiMessage);
  295.             break;
  296.       }
  297.       while(MyIntuiMessage = (struct IntuiMessage *)
  298.       GetMsg(wSuper->UserPort))
  299.       switch (MyIntuiMessage->Class) {
  300.          case CLOSEWINDOW:
  301.             ReplyMsg(MyIntuiMessage);
  302.             MyCleanup();
  303.             Exit(TRUE);
  304.             break;
  305.          default:
  306.             ReplyMsg(MyIntuiMessage);
  307.             break;
  308.       } /* switch */
  309.    } /* for */
  310. } /* end of Main */
  311.  
  312. MyCleanup_Normal()
  313. {
  314.    while(MyIntuiMessage = (struct IntuiMessage *)GetMsg(wNormal->UserPort))
  315.       ReplyMsg(MyIntuiMessage);
  316.    if (wNormal != 0)
  317.    CloseWindow(wNormal);
  318.    if (myplane != 0)
  319.    FreeRaster(myplane, WBMWIDTH, WBMHEIGHT);
  320. }
  321.  
  322. MyCleanup_Super()
  323. {
  324.    WORD i;
  325.    while(MyIntuiMessage = (struct IntuiMessage *)GetMsg(wSuper->UserPort))
  326.       ReplyMsg(MyIntuiMessage);
  327.    if (wSuper != 0)
  328.    CloseWindow(wSuper);
  329.    if (myplane2 != 0)
  330.    FreeRaster(myplane2, WBMWIDTH, WBMHEIGHT);
  331.    for (i=0; i<WBMDEPTH; i++)
  332.    {
  333.       if (MyBitMap.Planes[i] != 0)
  334.       FreeRaster(MyBitMap.Planes[i], WBMWIDTH, WBMHEIGHT);
  335.    }
  336. }
  337.  
  338. MyCleanup()
  339. {
  340.    MyCleanup_Normal();
  341.    MyCleanup_Super();
  342.    if (screen != 0)
  343.    CloseScreen(screen);
  344.    if (GfxBase != 0)
  345.    CloseLibrary(GfxBase);
  346.    if (IntuitionBase != 0)
  347.    CloseLibrary(IntuitionBase);
  348. }
  349.  
  350. DrawSquare(window, pen, x, y, x1, y1)
  351. struct Window *window;
  352. WORD pen, x, y, x1, y1; 
  353. {
  354.    SetAPen(window->RPort, pen);
  355.    SetDrMd(window->RPort, JAM1);
  356.    Move(window->RPort, x,   y);
  357.    Draw(window->RPort, x,  y1);
  358.    Draw(window->RPort, x1, y1);
  359.    Draw(window->RPort, x1,  y);
  360.    Draw(window->RPort, x,   y);
  361. }
  362.  
  363.